//宝石与石头
/*给你一个字符串 jewels 代表石头中宝石的类型，另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型，你想知道你拥有的石头中有多少是宝石。

字母区分大小写，因此 "a" 和 "A" 是不同类型的石头。
1 <= jewels.length, stones.length <= 50
jewels 和 stones 仅由英文字母组成
jewels 中的所有字符都是 唯一的
*/
class Solution {
public:
    int numJewelsInStones(string jewels, string stones) {
        int hash['z' - 'A' + 1] = {0};
        for (int i = 0; i < jewels.size(); i++) {
            hash[jewels[i]-'A']++;
        }
        int count=0;
        for(auto& i:stones)
        {
            if(hash[i-'A'])
            count++;
        }
        return count;
    }
};


//快乐数
/*编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为：

对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1，那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ；不是，则返回 false 。
1 <= n <= 231 - 1
*/
class Solution {
public:
    int next_num(int num) {
        int new_num = 0;
        while (num) {
            new_num += ((num % 10) * (num % 10));
            num /= 10;
        }
        return new_num;
    }
    bool isHappy(int n) {
        int slow = next_num(n);
        int quick = next_num(next_num(n));
        while (slow != quick) {
            slow = next_num(slow);
            quick = next_num(next_num(quick));
        }
        if (slow == 1)
            return true;
        else
            return false;
    }
};
